package com.blog.cmrpersonalblog.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.blog.cmrpersonalblog.entity.UserCollect;
import com.blog.cmrpersonalblog.dto.user.response.UserInteractionResponse;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 用户收藏Mapper接口
 */
public interface UserCollectMapper extends BaseMapper<UserCollect> {

    /**
     * 获取用户对指定文章的收藏状态
     * @param userId 用户ID
     * @param articleId 文章ID
     * @return 收藏记录
     */
    UserCollect selectUserCollectStatus(@Param("userId") Long userId, 
                                       @Param("articleId") Long articleId);

    /**
     * 批量获取用户对多个文章的收藏状态
     * @param userId 用户ID
     * @param articleIds 文章ID列表
     * @return 收藏记录列表
     */
    List<UserCollect> selectBatchUserCollectStatus(@Param("userId") Long userId, 
                                                  @Param("articleIds") List<Long> articleIds);

    /**
     * 更新或插入收藏状态
     * @param userCollect 收藏对象
     * @return 影响行数
     */
    int insertOrUpdateUserCollect(UserCollect userCollect);

    /**
     * 统计文章的收藏数
     * @param articleId 文章ID
     * @return 收藏数
     */
    Long countCollectsByArticle(@Param("articleId") Long articleId);

    /**
     * 批量统计多个文章的收藏数
     * @param articleIds 文章ID列表
     * @return 收藏统计列表
     */
    List<Long> countBatchCollectsByArticles(@Param("articleIds") List<Long> articleIds);

    /**
     * 获取用户收藏的文章列表
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 收藏的文章信息列表
     */
    List<UserInteractionResponse.CollectedArticleInfo> selectUserCollectedArticles(@Param("userId") Long userId, 
                                                                                   @Param("limit") Integer limit);

    /**
     * 获取用户收藏的文章ID列表
     * @param userId 用户ID
     * @return 文章ID列表
     */
    List<Long> selectUserCollectedArticleIds(@Param("userId") Long userId);

    /**
     * 分页获取用户收藏的文章列表
     * @param page 分页对象
     * @param userId 用户ID
     * @return 收藏的文章分页列表
     */
    IPage<UserInteractionResponse.CollectedArticleInfo> selectUserCollectedArticlesPage(Page<UserInteractionResponse.CollectedArticleInfo> page,
                                                                                         @Param("userId") Long userId);
}
